/**
 * ScreenshotParser - 截图解析器
 * 
 * 通过 GitCode API 的多模态能力识别聊天截图中的文字内容
 * Requirements: 6.1, 6.2, 6.3, 6.4, 6.5
 */

import type { ScreenshotParseResult, ValidationResult } from '../types';
import { GitCodeApiService, GitCodeApiError, defaultApiService } from './GitCodeApiService';
import { ChatParser } from './ChatParser';

/**
 * 置信度阈值，低于此值需要用户确认
 */
const CONFIDENCE_THRESHOLD = 0.8;

/**
 * 支持的图片格式
 */
const SUPPORTED_IMAGE_TYPES = ['image/png', 'image/jpeg', 'image/jpg', 'image/gif', 'image/webp'];

/**
 * 最大图片大小 (10MB)
 */
const MAX_IMAGE_SIZE = 10 * 1024 * 1024;

/**
 * OCR 识别提示词
 */
const OCR_PROMPT = `请识别这张聊天截图中的所有文字内容，并正确区分"我"和"对方"。

【核心规则 - 根据气泡颜色和位置判断】
1. 绿色气泡 或 蓝色气泡 或 屏幕右侧的气泡 = "我"发送的消息
2. 白色气泡 或 灰色气泡 或 屏幕左侧的气泡 = "对方"发送的消息

【发送者标记规则】
- "我"发送的消息：统一标记为"我"
- "对方"发送的消息：如果能看到对方昵称就用昵称，否则标记为"对方"

【输出格式】
发送者: 消息内容

【示例输出】
对方: 你好啊
我: 你好，最近怎么样？
对方: 挺好的，谢谢关心
我: 那就好

【注意事项】
- 按从上到下的时间顺序输出
- 每条消息一行
- 忽略时间戳、头像等非文字内容
- 如果是群聊，左侧不同人的消息用不同昵称区分，右侧都是"我"

【特殊情况】
- 非聊天截图 → 回复"这不是聊天截图"
- 图片模糊无法识别 → 末尾添加"[识别置信度: 低]"

直接输出识别结果，无需任何解释。`;

/**
 * 截图解析器类
 */
export class ScreenshotParser {
  private apiService: GitCodeApiService;
  private chatParser: ChatParser;

  constructor(apiService: GitCodeApiService = defaultApiService) {
    this.apiService = apiService;
    this.chatParser = new ChatParser();
  }

  /**
   * 验证图片文件
   * @param imageFile 图片文件
   * @returns 验证结果
   */
  validateImage(imageFile: File): ValidationResult {
    // 检查文件是否存在
    if (!imageFile) {
      return {
        valid: false,
        error: '请选择图片文件'
      };
    }

    // 检查文件类型
    if (!SUPPORTED_IMAGE_TYPES.includes(imageFile.type)) {
      return {
        valid: false,
        error: `不支持的图片格式: ${imageFile.type || '未知'}，支持的格式: PNG, JPEG, GIF, WebP`
      };
    }

    // 检查文件大小
    if (imageFile.size > MAX_IMAGE_SIZE) {
      return {
        valid: false,
        error: `图片文件过大: ${(imageFile.size / 1024 / 1024).toFixed(2)}MB，最大支持 10MB`
      };
    }

    // 检查文件大小是否为0
    if (imageFile.size === 0) {
      return {
        valid: false,
        error: '图片文件为空'
      };
    }

    return { valid: true };
  }

  /**
   * 将文件转换为 Base64
   * @param file 图片文件
   * @returns Base64 字符串（不含前缀）
   */
  private async fileToBase64(file: File): Promise<string> {
    return new Promise((resolve, reject) => {
      const reader = new FileReader();
      
      reader.onload = () => {
        const result = reader.result as string;
        // 移除 data:image/xxx;base64, 前缀
        const base64 = result.split(',')[1];
        if (base64) {
          resolve(base64);
        } else {
          reject(new Error('Base64 转换失败'));
        }
      };
      
      reader.onerror = () => {
        reject(new Error('文件读取失败'));
      };
      
      reader.readAsDataURL(file);
    });
  }

  /**
   * 解析 OCR 结果中的置信度
   * @param ocrResult OCR 识别结果
   * @returns 置信度 (0-1)
   */
  private parseConfidence(ocrResult: string): number {
    // 检查是否包含低置信度标记
    if (ocrResult.includes('[识别置信度: 低]') || 
        ocrResult.includes('模糊') || 
        ocrResult.includes('不清晰') ||
        ocrResult.includes('无法识别')) {
      return 0.5;
    }
    
    // 检查是否是非聊天截图
    if (ocrResult.includes('这不是聊天截图') || 
        ocrResult.includes('不是聊天') ||
        ocrResult.includes('无法识别聊天')) {
      return 0.0;
    }

    // 检查识别结果的质量
    const lines = ocrResult.split('\n').filter(line => line.trim().length > 0);
    
    // 如果没有识别出任何内容
    if (lines.length === 0) {
      return 0.0;
    }

    // 检查有多少行符合聊天格式
    const chatFormatPattern = /^.+[：:].+$/;
    const validLines = lines.filter(line => chatFormatPattern.test(line.trim()));
    
    // 计算格式匹配率
    const formatRatio = validLines.length / lines.length;
    
    // 基础置信度
    let confidence = 0.7 + (formatRatio * 0.3);
    
    // 如果识别出多条消息，增加置信度
    if (validLines.length >= 2) {
      confidence = Math.min(confidence + 0.1, 1.0);
    }

    return confidence;
  }

  /**
   * 清理 OCR 结果
   * @param ocrResult OCR 识别结果
   * @returns 清理后的文本
   */
  private cleanOcrResult(ocrResult: string): string {
    // 移除置信度标记
    let cleaned = ocrResult.replace(/\[识别置信度: [^\]]+\]/g, '');
    
    // 移除多余的空行
    cleaned = cleaned.split('\n')
      .map(line => line.trim())
      .filter(line => line.length > 0)
      .join('\n');
    
    return cleaned;
  }

  /**
   * 解析聊天截图
   * @param imageFile 图片文件
   * @returns 解析结果
   */
  async parse(imageFile: File): Promise<ScreenshotParseResult> {
    // 验证图片
    const validation = this.validateImage(imageFile);
    if (!validation.valid) {
      return {
        success: false,
        rawText: '',
        parsedChat: null,
        confidence: 0,
        needsConfirmation: false,
        error: validation.error
      };
    }

    try {
      // 转换为 Base64
      const base64 = await this.fileToBase64(imageFile);
      const mimeType = imageFile.type || 'image/png';

      // 调用 API 进行 OCR 识别
      const ocrResult = await this.apiService.analyzeImage(base64, OCR_PROMPT, mimeType);

      // 检查是否是非聊天截图
      if (ocrResult.includes('这不是聊天截图') || 
          ocrResult.includes('不是聊天') ||
          ocrResult.trim().length === 0) {
        return {
          success: false,
          rawText: ocrResult,
          parsedChat: null,
          confidence: 0,
          needsConfirmation: false,
          error: '请上传有效的聊天截图'
        };
      }

      // 解析置信度
      const confidence = this.parseConfidence(ocrResult);
      
      // 清理 OCR 结果
      const cleanedText = this.cleanOcrResult(ocrResult);

      // 使用 ChatParser 解析聊天内容
      const parseResult = this.chatParser.parse(cleanedText);

      if (!parseResult.success || !parseResult.data) {
        return {
          success: false,
          rawText: cleanedText,
          parsedChat: null,
          confidence,
          needsConfirmation: confidence < CONFIDENCE_THRESHOLD,
          error: parseResult.error || '无法解析聊天记录格式'
        };
      }

      return {
        success: true,
        rawText: cleanedText,
        parsedChat: parseResult.data,
        confidence,
        needsConfirmation: confidence < CONFIDENCE_THRESHOLD
      };

    } catch (error) {
      // 处理 API 错误
      if (error instanceof GitCodeApiError) {
        return {
          success: false,
          rawText: '',
          parsedChat: null,
          confidence: 0,
          needsConfirmation: false,
          error: `API 调用失败: ${error.message}`
        };
      }

      // 处理其他错误
      return {
        success: false,
        rawText: '',
        parsedChat: null,
        confidence: 0,
        needsConfirmation: false,
        error: `解析失败: ${error instanceof Error ? error.message : String(error)}`
      };
    }
  }

  /**
   * 更新 API 服务配置
   * @param apiKey API 密钥
   */
  setApiKey(apiKey: string): void {
    this.apiService.updateConfig({ apiKey });
  }

  /**
   * 获取置信度阈值
   */
  static getConfidenceThreshold(): number {
    return CONFIDENCE_THRESHOLD;
  }
}

// 导出单例实例（使用默认 API 服务）
export const screenshotParser = new ScreenshotParser();
